package com.itheima.exception;

import com.itheima.exception.MyException.HaveStudentException;
import com.itheima.pojo.Result;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.lang.reflect.InvocationTargetException;

@RestControllerAdvice
@Component
public class GlobalExceptionHandler {
    @ExceptionHandler(HaveStudentException.class)
    public Result haveStudentExceptionHandler(HaveStudentException hse){
        return Result.error("该班级下尚有学生，不能删除！");
    }

    @ExceptionHandler(InvocationTargetException.class)
    public Result handleInvocationTargetException(InvocationTargetException e) {
        Throwable originalException = e.getTargetException();
        // 如果原始异常是我们关心的自定义异常，直接用它返回
       /* e.getTargetException() 是 InvocationTargetException 类的核心方法，用于获取被反射调用的方法实际抛出的原始异常。
        当通过 Java 反射机制（如 Method.invoke()）调用某个方法时，如果被调用的方法本身抛出了异常（比如你的 HaveStudentException）
        ，这个异常不会直接抛出，而是会被 Java 包装成一个 InvocationTargetException（调用目标异常）。
        此时：
        外层的 InvocationTargetException 是 “包装异常”，它只是告诉你 “反射调用过程中出了问题”
        而 e.getTargetException() 能 “拆包”，拿到被调用方法实际抛出的原始异常（比如你的 HaveStudentException）*/
        if (originalException instanceof HaveStudentException) {
            return haveStudentExceptionHandler((HaveStudentException) originalException);
        }
        else {
            // 其他原始异常，返回通用错误
            return Result.error("系统错误：" + originalException.getMessage());
        }
    }
    @ExceptionHandler(Exception.class)
    public Result exceptionHandler(Exception e){
        return Result.error("啊哦，出错了！");
    }

}
